﻿using System;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace LASLogic.BusinessLayer.DataModel
{
    /// <summary>
    /// Clase que maneja las cuentas existentes en el sistema
    /// </summary>
    [DataContract(IsReference = true)]
    public class Account
    {
        #region Properties

        /// <summary>
        /// Id único de la cuenta
        /// </summary>
        [DataMember]
        public int AccountId { get; set; }
        /// <summary>
        /// Nombre de la cuenta
        /// </summary>
        [DataMember]
        public string AccountName { get; set; }
        /// <summary>
        /// Codigo de 15 caracteres de la cuenta
        /// </summary>
        [DataMember]
        public string AccountCode { get; set; }
        /// <summary>
        /// Nombre en idioma extranjero de la cuenta
        /// </summary>
        [DataMember]
        public string ForeignName { get; set; }
        /// <summary>
        /// Tipo de cuenta
        /// </summary>
        [DataMember]
        public string AccountType { get; set; }
        /// <summary>
        /// Estado de la cuenta
        /// </summary>
        [DataMember]
        public string AccountStatus { get; set; }
        /// <summary>
        /// Id único de la compañia
        /// </summary>
        [DataMember]
        public int CompanyId { get; set; }
        /// <summary>
        /// Nivel en el que se encuentra la cuenta
        /// </summary>
        [DataMember]
        public int Level { get; set; }
        /// <summary>
        /// Id de la cuenta padre
        /// </summary>
        [DataMember]
        public int ParentAccountId { get; set; }
        /// <summary>
        /// Referencia a cuenta Padre
        /// </summary>
        [DataMember]
        public Account ParentAccount { get; set; }
        /// <summary>
        /// Cuentas hijo de esta cuenta
        /// </summary>
        [DataMember]
        public List<Account> Children { get; set; }             
        /// <summary>
        /// Moneda en la que se encuentra la cuenta
        /// </summary>
        [DataMember]
        public Currency Currency { get; set; }
        /// <summary>
        /// LocalBalance de la cuenta
        /// </summary>
        [DataMember]
        public Decimal LocalBalance { get; set; }
        /// <summary>
        /// LocalBalance de la cuenta
        /// </summary>
        [DataMember]
        public Decimal SystemBalance { get; set; }
        /// <summary>
        /// Identificador del catálogo de cuentas
        /// </summary>
        [DataMember]
        public int AccountCatalogId { get; set; }
        #endregion

        #region Constructor

        /// <summary>
        /// Constructor de la clase, permite crear una nueva cuenta
        /// </summary>
        /// <param name="accountId">Identicador de la cuenta</param>
        /// <param name="accountName">Nombre de la cuenta</param>
        /// <param name="accountCode">Codigo alfanumerico de 15 caracteres</param>
        /// <param name="foreignName">Nombre de la cuenta en extranjero</param>
        /// <param name="accountType">Tipo de la cuenta</param>
        /// <param name="accountStatus">Estado de la cuenta</param>
        /// <param name="companyId">Identificador de la compañia</param>
        /// <param name="level">Nivel en que se encuentra la cuenta</param>
        /// <param name="parentAccountId">Identificador de la cuenta padre</param>
        /// <param name="parentAccount">Referencia a la cuenta padre</param>
        /// <param name="children">Lista de hijos</param>
        /// <param name="currency">Moneda de la cuenta</param>
        /// <param name="localBalance">Balance total en moneda local</param>
        /// <param name="systemBalance">Balance total en moneda del sistema</param>
        /// <param name="accountCatalogId">Identificador del catalogo al que pertenece esta cuenta</param>
        public Account(int accountId, string accountName, string accountCode, string foreignName, string accountType, string accountStatus, int companyId, int level, int parentAccountId, Account parentAccount, List<Account> children, Currency currency, decimal localBalance, decimal systemBalance, int accountCatalogId)
        {
            AccountId = accountId;
            AccountName = accountName;
            AccountCode = accountCode;
            ForeignName = foreignName;
            AccountType = accountType;
            AccountStatus = accountStatus;
            CompanyId = companyId;
            Level = level;
            ParentAccountId = parentAccountId;
            ParentAccount = parentAccount;
            Children = children;
            Currency = currency;
            LocalBalance = localBalance;
            SystemBalance = systemBalance;
            AccountCatalogId = accountCatalogId;
        }

        
        /// <summary>
        /// Constructor vacio
        /// </summary>
        public Account()
        {
        }

        #endregion
    }

  
}
